/*
 * TOP SECRET Copyright 2006-2015 Transsion.com All right reserved. This software is the confidential and proprietary
 * information of Transsion.com ("Confidential Information"). You shall not disclose such Confidential Information and
 * shall use it only in accordance with the terms of the license agreement you entered into with Transsion.com.
 */
package com.yunji.framework_template.web.config;

import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import com.github.benmanes.caffeine.cache.Caffeine;

/**
 * Cache配置類，用于设置本地缓存使用的缓存实现类，这里使用的是Caffeine <br>
 * Cache注解的使用，参看官方文档：https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#cache-annotations-caching
 * <br>
 * ClassName:CacheConfig <br/>
 * Date: 2018年10月9日 上午10:36:13 <br/>
 * 
 * @author fenglibin1982@163.com
 * @Blog http://blog.csdn.net/fenglibing
 * @version
 * @see
 */
@Configuration
@EnableCaching
public class CacheConfig {

    // 默认的单个缓存组可以保留的最大缓存数量
    public static final int DEFAULT_MAXSIZE = 10000;
    // 默认缓存的过期时间为1天
    public static final int DEFAULT_TTL     = 86400;

    /**
     * 定義cache名稱、超時時長（秒）、最大容量 每个cache缺省：10秒超时、最多缓存50000条数据，需要修改可以在构造方法的参数中指定。
     */
    public enum Cache {
                       // 定义需要用的到Cache组策略
                       cache_framework_template_test(300), // 有效期5分钟，默认最大容量为10000
                       cache_framework_template_something, // 默认1天，默认最大容量为10000
                       cache_framework_template_otherthing(3600, 1000); // 10分钟，最大容量1000

        Cache(){
        }

        Cache(int ttl){
            this.ttl = ttl;
        }

        Cache(int ttl, int maxSize){
            this.ttl = ttl;
            this.maxSize = maxSize;
        }

        private int maxSize = DEFAULT_MAXSIZE; // 最大數量
        private int ttl     = DEFAULT_TTL;     // 过期时间（秒）

        public int getMaxSize() {
            return maxSize;
        }

        public int getTtl() {
            return ttl;
        }
    }

    /**
     * 创建基于Caffeine的Cache Manager
     * 
     * @return
     */
    @Bean
    @Primary
    public CacheManager caffeineCacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();

        ArrayList<CaffeineCache> caches = new ArrayList<CaffeineCache>();
        for (Cache cache : Cache.values()) {
            caches.add(new CaffeineCache(cache.name(),
                                         Caffeine.newBuilder().recordStats().expireAfterWrite(cache.getTtl(),
                                                                                              TimeUnit.SECONDS).maximumSize(cache.getMaxSize()).build()));
        }

        cacheManager.setCaches(caches);

        return cacheManager;
    }

}
